import pandas as pd
import numpy as np
data = pd.read_csv('청년통장정보.csv')
C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3165: DtypeWarning: Columns (9,10,11,13,18,21,22,23,25,28,48,49,50,51,52) have mixed types.Specify dtype option on import or set low_memory=False. has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
# 컬럼명 한글로 바꾸기
columns = ['청년통장정보번호', '저축목적명', '연령', '성별코드',
'결혼상태명','우편번호', '지번주소','가구원수','경기도거주기간명',
'직업명','3D업종명', '제조업종명', '근로형태명',
'근무처경기도지역여부','근무처우편번호','근무처도로명주소',
'근무처도로명상세주소', '근무처지번주소', '근무처지번상세주소',
'근무처명', '근로기간명', '거주상태명', '자동차본인명',
'자동차가구원명', '부채상환본인대출금액', '부채상환본인내용',
'부채상환본인부재여부','부채상환가구원금액','부채상환가구원내용',
'부채상환가구원부재여부', '신청사유내용', '전세월세보증금액',
'상가보증금액','기타금액','단계1동의여부','단계2동의여부',
'단계3동의여부','개인정보사용동의여부','개인정보사용동의일시',
'신청상태명','신청일시','재신청일시','거절사유내용','거절일자',
'등록일시','수정일시','사용여부','삭제여부','신청경로명',
'가산점수값','직업유형명','기업유형명','건강보험명',
'건강보험료월1금액','건강보험료월2금액','건강보험료월3금액',
'건강보험료평균금액','파티션기준일']
data.columns = columns
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 238152 entries, 0 to 238151 Data columns (total 58 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 청년통장정보번호 238152 non-null int64 1 저축목적명 229235 non-null object 2 연령 238152 non-null int64 3 성별코드 236409 non-null object 4 결혼상태명 232163 non-null object 5 우편번호 235522 non-null float64 6 지번주소 238152 non-null object 7 가구원수 238152 non-null int64 8 경기도거주기간명 235248 non-null object 9 직업명 103450 non-null object 10 3D업종명 8895 non-null object 11 제조업종명 20022 non-null object 12 근로형태명 194052 non-null object 13 근무처경기도지역여부 168737 non-null object 14 근무처우편번호 230415 non-null float64 15 근무처도로명주소 230420 non-null object 16 근무처도로명상세주소 229659 non-null object 17 근무처지번주소 238152 non-null object 18 근무처지번상세주소 13437 non-null object 19 근무처명 230574 non-null object 20 근로기간명 231968 non-null object 21 거주상태명 103449 non-null object 22 자동차본인명 103449 non-null object 23 자동차가구원명 103449 non-null object 24 부채상환본인대출금액 238152 non-null int64 25 부채상환본인내용 45818 non-null object 26 부채상환본인부재여부 238152 non-null object 27 부채상환가구원금액 238152 non-null int64 28 부채상환가구원내용 8642 non-null object 29 부채상환가구원부재여부 238152 non-null object 30 신청사유내용 226893 non-null object 31 전세월세보증금액 238152 non-null int64 32 상가보증금액 238152 non-null int64 33 기타금액 238152 non-null int64 34 단계1동의여부 238152 non-null object 35 단계2동의여부 238152 non-null object 36 단계3동의여부 238152 non-null object 37 개인정보사용동의여부 238152 non-null object 38 개인정보사용동의일시 238152 non-null object 39 신청상태명 238152 non-null object 40 신청일시 238152 non-null object 41 재신청일시 8101 non-null object 42 거절사유내용 46916 non-null object 43 거절일자 52006 non-null object 44 등록일시 238152 non-null object 45 수정일시 238152 non-null object 46 사용여부 238152 non-null object 47 삭제여부 238152 non-null object 48 신청경로명 131768 non-null object 49 가산점수값 128046 non-null object 50 직업유형명 128862 non-null object 51 기업유형명 128466 non-null object 52 건강보험명 127286 non-null object 53 건강보험료월1금액 133286 non-null float64 54 건강보험료월2금액 65288 non-null float64 55 건강보험료월3금액 65288 non-null float64 56 건강보험료평균금액 133286 non-null float64 57 파티션기준일 238152 non-null object dtypes: float64(6), int64(8), object(44) memory usage: 105.4+ MB
# 1차 중복 제거
data[data.duplicated(columns[1:])]
청년통장정보번호 | 저축목적명 | 연령 | 성별코드 | 결혼상태명 | 우편번호 | 지번주소 | 가구원수 | 경기도거주기간명 | 직업명 | ... | 신청경로명 | 가산점수값 | 직업유형명 | 기업유형명 | 건강보험명 | 건강보험료월1금액 | 건강보험료월2금액 | 건강보험료월3금액 | 건강보험료평균금액 | 파티션기준일 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
41 | 42 | 주거자금 | 30 | M | 생산직 | 10872.0 | 1 | 1년 이상 ~ 2년 미만 | 개인회생 및 신용회복지원 대상자(12개월 이상 변제) | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
379 | 380 | 주거자금 | 30 | M | 생산직 | 14418.0 | 6 | 3년 이상 ~ 4년 미만 | 해당없음 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
380 | 381 | 주거자금 | 30 | M | 생산직 | 14418.0 | 6 | 3년 이상 ~ 4년 미만 | 해당없음 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
440 | 441 | 주거자금 | 20 | M | 생산직 | 14085.0 | 1 | 3년 이상 ~ 4년 미만 | 개인회생 및 신용회복지원 대상자(12개월 이상 변제) | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
441 | 442 | 주거자금 | 20 | M | 생산직 | 14085.0 | 1 | 3년 이상 ~ 4년 미만 | 개인회생 및 신용회복지원 대상자(12개월 이상 변제) | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
238146 | 238201 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238147 | 238202 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238148 | 238203 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238149 | 238204 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238150 | 238205 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 |
286 rows × 58 columns
data.drop_duplicates(columns[1:], keep = 'first')
청년통장정보번호 | 저축목적명 | 연령 | 성별코드 | 결혼상태명 | 우편번호 | 지번주소 | 가구원수 | 경기도거주기간명 | 직업명 | ... | 신청경로명 | 가산점수값 | 직업유형명 | 기업유형명 | 건강보험명 | 건강보험료월1금액 | 건강보험료월2금액 | 건강보험료월3금액 | 건강보험료평균금액 | 파티션기준일 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 주거자금 | 40 | M | 사무직 | 16630.0 | 4 | 6개월 미만 | 해당없음 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
1 | 2 | 주거자금 | 50 | M | 사무직 | 1022.0 | 4 | 6개월 미만 | 개인회생 및 신용회복지원 대상자(12개월 이상 변제) | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
2 | 3 | 기타 꿈을 위한 준비자금 | 30 | M | 생산직 | 51638.0 | 3 | 6개월 미만 | 소상공인 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
3 | 4 | 결혼자금 | 20 | F | 생산직 | 16988.0 | 3 | 2년 이상 ~ 3년 미만 | 사회적경제조직 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
4 | 5 | 결혼자금 | 20 | F | 생산직 | 11341.0 | 3 | 3년 이상 ~ 4년 미만 | 개인회생 및 신용회복지원 대상자(12개월 이상 변제) | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2017-04-10 | |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
238128 | 238183 | 대출금상환 | 30 | F | 생산직 | 16385.0 | 5 | 3년 이상 | NaN | ... | SNS | 해당없음 | 도매 및 소매업(판매) | 5인 미만 | 직장가입자 | 441000.0 | NaN | NaN | 441000.0 | 2020-07-08 | |
238129 | 238184 | 기타 꿈을 위한 준비자금 | 20 | F | 생산직 | 15887.0 | 4 | 3년 이상 | NaN | ... | 인터넷 | 해당없음 | 서비스업(출판; 영상; 정보; 금융; 부동산; 공공서비스; 사회복지; 보건; 교육서... | 10인 ~ 100인 미만 | 직장가입자 | 145940.0 | NaN | NaN | 145940.0 | 2020-07-08 | |
238130 | 238185 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238131 | 238186 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 | |
238151 | 238206 | NaN | 30 | F | 생산직 | 14982.0 | 1 | 1년 이상 ~3년 미만 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 2020-06-29 |
237866 rows × 58 columns
income = pd.read_csv('청년통장선발정보.csv')
income.head()
C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3165: DtypeWarning: Columns (8,34,38,51,52,53,55,60,63,64,65) have mixed types.Specify dtype option on import or set low_memory=False. has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
SELECTN_INFO_NO | ERNM_AMOUNT | BSNS_INCOME_AMOUNT | PRPRTY_INCOME_AMOUNT | ETC_INCOME_AMOUNT | REAL_INCOME_AMOUNT | MXMM_INCOME_RCOGN_AMOUNT | HSHLD_CHARTR_CRRSPND_AT | VHCLE_HOLD_STTUS_NM | ADDI_STDR_SUFFCN_NM | ... | WRKPLC_RDNMADR | WRKPLC_RN_DETAIL_ADRES | WRKPLC_LNM_ADRES | WRKPLC_LNM_DETAIL_ADRES | WRKPLC_NM | LABOR_PD_NM | RESIDE_STTUS_NM | CAR_SELF_NM | CAR_HSHLDM_NM | PRTITN_STDDE | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 4 | 1400000 | 0 | 0 | 0 | 1400000 | 3640915 | N | 차량없음 | 사회적 | ... | 경기 용인시 기흥구 동백중앙로16번길 16-25 (중동;대우프론티어밸리 Ⅰ) | 713호 그린바이오(주) | 경기 용인시 기흥구 ** **** | 713호 그린바이오(주) | 그린바이오(주) | 6개월 미만 | 2천만원이상~5천만원미만 전월세 | 차량없음 | 차량없음 | 2017-04-18 |
1 | 5 | 3736315 | 0 | 0 | 0 | 3736315 | 3640915 | N | 차량없음 | NaN | ... | 경기 양주시 남면 삼육사로 249-38 (한산리) | 한산리 | 경기 양주시 남면 *** *** | NaN | 보이트씨앤아이 | 2년 이상 ~ 3년 미만 | 무상거주 | 차량없음 | 2;000cc 이상 | 2017-04-18 |
2 | 7 | 1300000 | 0 | 0 | 0 | 1300000 | 1652931 | N | 차량없음 | NaN | ... | 경기 고양시 일산동구 중앙로 1130 (마두동;강촌마을6단지아파트) | 국립암센터 | 경기 고양시 일산동구 *** *** | NaN | 국립암센터 | 6개월 미만 | 2천만원 미만 전월세 | 차량없음 | 차량없음 | 2017-04-18 |
3 | 8 | 2645299 | 0 | 0 | 869375 | 3514674 | 2814449 | Y | 차량없음 | NaN | ... | 경기 오산시 경기대로 304 (오산동) | 리더스센터 3층 | 경기 오산시 오산동 ***** | NaN | (주)오산교차로 | 4년 이상 | 2천만원 미만 전월세 | 차량없음 | 차량없음 | 2017-05-01 |
4 | 10 | 3325000 | 0 | 0 | 0 | 3325000 | 4467380 | N | 차량없음 | NaN | ... | 경기 하남시 서하남로418번길 46 (춘궁동) | (주)파로스 | 경기 하남시 춘궁동 *** | NaN | (주)파로스 | 3년 이상 ~ 4년 미만 | 5천만원이상~1억원미만 전월세 | 차량없음 | 1;000cc 미만 경차 | 2017-04-20 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
94275 | 238173 | 0 | 0 | 0 | 0 | 0 | 1757000 | N | NaN | 해당없음 | ... | 경기 파주시 경의로 1324 (와동동) | 운정벧엘교회 | 경기 파주시 와동동 **** | NaN | 부교역자 | 1년 미만 | NaN | NaN | NaN | 2020-07-15 |
94276 | 238174 | 0 | 0 | 0 | 0 | 0 | 4749000 | N | NaN | 해당없음 | ... | 경기 파주시 문산읍 돈유2로 8 (선유리) | 82 | 경기 파주시 문산읍 *** **** | NaN | 창성시트 | 1년 미만 | NaN | NaN | NaN | 2020-07-21 |
94277 | 238178 | 0 | 0 | 0 | 0 | 0 | 2992000 | N | NaN | 해당없음 | ... | 경기 용인시 수지구 만현로 120 (상현동;SR프라자) | 3층 | 경기 용인시 수지구 *** *** | NaN | 팍스어학원 | 1년 미만 | NaN | NaN | NaN | 2020-07-27 |
94278 | 238181 | 0 | 0 | 0 | 0 | 0 | 4749000 | N | NaN | 해당없음 | ... | 경기 수원시 영통구 효원로 363 (매탄동;매탄 위브 하늘채) | 상가b동 315호 | 경기 수원시 영통구 *** **** | NaN | 건강필약국 | 1년 미만 | NaN | NaN | NaN | 2020-08-10 |
94279 | 238184 | 0 | 0 | 0 | 0 | 0 | 4749000 | N | NaN | 해당없음 | ... | 서울 영등포구 여의대로 8 (여의도동;여의도파크센터) | 지하 2층 수데스크 리셉션 | 서울 영등포구 여의도동 **** | NaN | 여의도 메리어트호텔 | 1년 미만 | NaN | NaN | NaN | 2020-08-07 |
94280 rows × 67 columns
income.columns
Index(['SELECTN_INFO_NO', 'ERNM_AMOUNT', 'BSNS_INCOME_AMOUNT', 'PRPRTY_INCOME_AMOUNT', 'ETC_INCOME_AMOUNT', 'REAL_INCOME_AMOUNT', 'MXMM_INCOME_RCOGN_AMOUNT', 'HSHLD_CHARTR_CRRSPND_AT', 'VHCLE_HOLD_STTUS_NM', 'ADDI_STDR_SUFFCN_NM', 'FSTLTN_INCOME_RESULT_VALUE', 'HSHLD_CHARTR_SCORE', 'GG_RESIDE_PD_SCORE', 'NOW_WRC_LABOR_PD_SCORE', 'RESIDE_STTUS_SCORE', 'VHCLE_HOLD_STTUS_SCORE', 'FSTLTN_INCOME_RESULT_SCORE', 'ADDI_STDR_SUFFCN_SCORE', 'EVL_SCORE_TOT_SCORE', 'BSIS_DDCAMOUNT', 'DEBT_AMOUNT', 'RSDNTL_PRPRTY_AMOUNT', 'RSDNTL_INCOME_CNVRSN_AM', 'GNRL_PRPRTY_AMOUNT', 'GNRL_PRPRTY_INCOME_CNVRSN_AM', 'CAR_PRPRTY_AMOUNT', 'CAR_PRPRTY_INCOME_CNVRSN_AM', 'PRPRTY_INCOME_CNVRSN_AMOUNT', 'INCOME_RCOGN_AMOUNT', 'PROPER_STTUS_NM', 'PREPAR_SELECTN_RANK', 'EMD_CHARGER_CNFIRM_NM', 'EMD_CHARGER_CNFIRM_DT', 'UNITY_EXAMIN_CHARGER_CNFIRM_NM', 'UNITY_EXAMIN_CHARGER_CNFIRM_DT', 'SPORT_TRGET_AT', 'CTPRVN_CHARGER_CNFIRM_NM', 'CTPRVN_CHARGER_CNFIRM_DE', 'RM_CN', 'REGIST_DT', 'UPDT_DT', 'DELETE_AT', 'WORK_LOCPLC_SCORE', 'SVINGS_PURPS_NM', 'AGE', 'SEXDSTN_CODE', 'MRRG_STTUS_NM', 'ZIP', 'LNM_ADRES', 'HSHLDM_CO', 'GG_RESIDE_PD_NM', 'OCCP_NM', 'DDDSTRY_NM', 'MNFCTUR_INDUTY_NM', 'LABOR_STLE_NM', 'WRKPLC_GG_AREA_AT', 'WRKPLC_ZIP', 'WRKPLC_RDNMADR', 'WRKPLC_RN_DETAIL_ADRES', 'WRKPLC_LNM_ADRES', 'WRKPLC_LNM_DETAIL_ADRES', 'WRKPLC_NM', 'LABOR_PD_NM', 'RESIDE_STTUS_NM', 'CAR_SELF_NM', 'CAR_HSHLDM_NM', 'PRTITN_STDDE'], dtype='object')
income[income.duplicated(['ERNM_AMOUNT','MXMM_INCOME_RCOGN_AMOUNT','REAL_INCOME_AMOUNT','WRKPLC_RDNMADR','WRKPLC_NM'])]
SELECTN_INFO_NO | ERNM_AMOUNT | BSNS_INCOME_AMOUNT | PRPRTY_INCOME_AMOUNT | ETC_INCOME_AMOUNT | REAL_INCOME_AMOUNT | MXMM_INCOME_RCOGN_AMOUNT | HSHLD_CHARTR_CRRSPND_AT | VHCLE_HOLD_STTUS_NM | ADDI_STDR_SUFFCN_NM | ... | WRKPLC_RDNMADR | WRKPLC_RN_DETAIL_ADRES | WRKPLC_LNM_ADRES | WRKPLC_LNM_DETAIL_ADRES | WRKPLC_NM | LABOR_PD_NM | RESIDE_STTUS_NM | CAR_SELF_NM | CAR_HSHLDM_NM | PRTITN_STDDE | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4405 | 7520 | 1352230 | 0 | 0 | 0 | 1352230 | 1652931 | N | 차량없음 | 사회적 | ... | 경기 성남시 분당구 야탑로205번길 40 (야탑동;야탑브라운스톤오피스텔) | 1층 | 경기 성남시 분당구 *** ***** | NaN | 이크택견 | 1년 미만 | 2천만원 미만 전월세 | 차량없음 | 차량없음 | 2017-04-24 |
5394 | 9392 | 1010000 | 0 | 0 | 0 | 1010000 | 1652931 | N | 차량없음 | NaN | ... | 경기 안산시 상록구 시낭북로 4 (부곡동;월피동주민센터) | 3층 | 경기 안산시 상록구 *** *** | NaN | 월피동주민센터 | 6개월 미만 | 2천만원 미만 전월세 | 차량없음 | 차량없음 | 2017-04-21 |
6497 | 11267 | 2000000 | 0 | 0 | 0 | 2000000 | 4467380 | N | 차량없음 | NaN | ... | 경기 성남시 분당구 효자길 39 (서현동) | 분당중앙교회 | 경기 성남시 분당구 *** *** | NaN | 분당중앙교회 | 1년 이상 ~ 2년 미만 | 5천만원이상~1억원미만 전월세 | 차량없음 | 차량없음 | 2017-04-27 |
8315 | 14308 | 2953938 | 0 | 0 | 0 | 2953938 | 3640915 | N | 차량없음 | NaN | ... | 서울 강남구 강남대로96길 9 (역삼동) | 역삼동 817-11 | 서울 강남구 역삼동 ****** | NaN | 배스킨라빈스 강남중앙점 | 6개월 미만 | 자가 | 차량없음 | 차량없음 | 2017-04-25 |
10877 | 18651 | 1544000 | 0 | 0 | 0 | 1544000 | 1652931 | N | 차량없음 | NaN | ... | 경기 고양시 일산서구 덕이로172번길 4-39 (덕이동;고양예술고등학교) | 고양예술고등학교 | 경기 고양시 일산서구 *** ****** | NaN | 고양예술고등학교 | 3년 이상 ~ 4년 미만 | 2천만원이상~5천만원미만 전월세 | 차량없음 | 차량없음 | 2017-04-21 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
93945 | 237519 | 0 | 0 | 0 | 0 | 0 | 3871000 | N | NaN | 해당없음 | ... | 경기 양평군 강하면 강남로 316 (전수리) | 경기 양평군 강하면 강남로 316 | 경기 양평군 강하면 *** **** | NaN | 현대그린푸드 | 1년 이상 ~ 2년 미만 | NaN | NaN | NaN | 2020-08-05 |
94083 | 237801 | 0 | 0 | 0 | 0 | 0 | 4749000 | N | NaN | 해당없음 | ... | 경기 수원시 영통구 봉영로 1605 (영통동;모던타운) | 6층; 603호; 이안서가 | 경기 수원시 영통구 *** ***** | NaN | 이안서가 영통원 | 1년 이상 ~ 2년 미만 | NaN | NaN | NaN | 2020-07-15 |
94154 | 237941 | 0 | 0 | 0 | 0 | 0 | 1757000 | N | NaN | 해당없음 | ... | 경기 성남시 분당구 수내로 50 (수내동;수내동업무빌딩) | 10층 | 경기 성남시 분당구 *** *** | NaN | WMC | 1년 미만 | NaN | NaN | NaN | 2020-07-22 |
94244 | 238119 | 0 | 0 | 0 | 0 | 0 | 3871000 | N | NaN | 해당없음 | ... | 경기 안양시 만안구 명학로33번길 8 (안양동;메트로병원) | 지하1층 | 경기 안양시 만안구 *** ******* | NaN | 메트로병원 | 1년 이상 ~ 2년 미만 | NaN | NaN | NaN | 2020-07-27 |
94265 | 238151 | 0 | 0 | 0 | 0 | 0 | 2992000 | N | NaN | 해당없음 | ... | 경기 화성시 마도면 마도공단로6길 33 (쌍송리) | 성안기계 생산부 | 경기 화성시 마도면 *** *** | NaN | 성안기계 | 4년 이상 | NaN | NaN | NaN | 2020-08-10 |
1135 rows × 67 columns
<경기도 일자리 청년통장선발정보>의 '선발정보번호'와 <경기도 일자리 청년통장정보>의 '청년통장정보번호'가 같음
income.columns = ['선발정보번호','근로소득금액','사업소득금액','재산소득금액','기타소득금액','실제소득금액','최대소득인정금액',
'가구특성해당여부','차량보유상태명','가산기준충족명','중위소득결과값','가구특성점수','경기도거주기간점수',
'현재직장근로기간점수','거주상태점수','차량보유상태점수','중위소득결과점수','가산기준충족점수','평가점수총점수',
'기초공제금액','부채금액','주거용재산금액','주거용소득환산액','일반재산금액','일반재산소득환산액','자동차재산금액',
'자동차재산소득환산액','재산소득환산금액','소득인정금액','적격상태명','예비선발순위','읍면동담당자확인명',
'읍면동담당자확인일시','통합조사담당자확인명','통합조사담당자확인일시','지원대상여부','시도담당자확인명',
'시도담당자확인일자','비고내용','등록일시','수정일시','삭제여부','근무소재지점수','저축목적명','연령','성별코드',
'결혼상태명','우편번호','지번주소','가구원수','경기도거주기간명','직업명','3D업종명','제조업종명','근로형태명',
'근무처경기도지역여부','근무처우편번호','근무처도로명주소','근무처도로명상세주소','근무처지번주소',
'근무처지번상세주소','근무처명','근로기간명','거주상태명','자동차본인명','자동차가구원명','파티션기준일']
data=data.rename(columns={'청년통장정보번호':'선발정보번호'})
merged = pd.merge(income, data, on = '선발정보번호', how='left')
check = []
for a in list(merged.columns) :
if 'x' in a :
check.append(a)
check = [a.replace('_x','') for a in check]
check
['등록일시', '수정일시', '삭제여부', '저축목적명', '연령', '성별코드', '결혼상태명', '우편번호', '지번주소', '가구원수', '경기도거주기간명', '직업명', '3D업종명', '제조업종명', '근로형태명', '근무처경기도지역여부', '근무처우편번호', '근무처도로명주소', '근무처도로명상세주소', '근무처지번주소', '근무처지번상세주소', '근무처명', '근로기간명', '거주상태명', '자동차본인명', '자동차가구원명', '파티션기준일']
for a in check :
print(merged.head()[[a+'_x',a+'_y']])
등록일시_x 등록일시_y 0 2017-04-18 15:55 2017-04-10 08:47 1 2017-04-18 12:01 2017-04-10 08:48 2 2017-04-18 12:01 2017-04-10 08:48 3 2017-05-01 14:43 2017-04-10 08:49 4 2017-04-20 09:56 2017-04-10 08:49 수정일시_x 수정일시_y 0 2017-06-01 10:15 2019-02-14 14:33 1 2017-05-25 12:39 2017-06-01 16:18 2 2017-05-31 13:51 2019-12-06 10:53 3 2017-05-25 10:35 2017-06-01 17:48 4 2018-03-27 13:51 2019-03-25 12:36 삭제여부_x 삭제여부_y 0 N N 1 N N 2 N N 3 N N 4 N N 저축목적명_x 저축목적명_y 0 결혼자금 결혼자금 1 결혼자금 결혼자금 2 기타 꿈을 위한 준비자금 기타 꿈을 위한 준비자금 3 대출금상환 대출금상환 4 주거자금 주거자금 연령_x 연령_y 0 20 20 1 20 20 2 20 20 3 20 20 4 30 30 성별코드_x 성별코드_y 0 F F 1 F F 2 F F 3 F F 4 F F 결혼상태명_x 결혼상태명_y 0 생산직 생산직 1 생산직 생산직 2 생산직 생산직 3 생산직 생산직 4 사무직 사무직 우편번호_x 우편번호_y 0 16988 16988.0 1 11341 11341.0 2 13202 13202.0 3 18116 18116.0 4 12920 12920.0 지번주소_x 지번주소_y 0 1 2 3 4 가구원수_x 가구원수_y 0 3 3 1 3 3 2 1 1 3 2 2 4 4 4 경기도거주기간명_x 경기도거주기간명_y 0 2년 이상 ~ 3년 미만 2년 이상 ~ 3년 미만 1 3년 이상 ~ 4년 미만 3년 이상 ~ 4년 미만 2 3년 이상 ~ 4년 미만 3년 이상 ~ 4년 미만 3 3년 이상 ~ 4년 미만 3년 이상 ~ 4년 미만 4 3년 이상 ~ 4년 미만 3년 이상 ~ 4년 미만 직업명_x 직업명_y 0 사회적경제조직 사회적경제조직 1 개인회생 및 신용회복지원 대상자(12개월 이상 변제) 개인회생 및 신용회복지원 대상자(12개월 이상 변제) 2 해당없음 해당없음 3 해당없음 해당없음 4 해당없음 해당없음 3D업종명_x 3D업종명_y 0 NaN NaN 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN 제조업종명_x 제조업종명_y 0 NaN NaN 1 사무직 사무직 2 NaN NaN 3 NaN NaN 4 NaN NaN 근로형태명_x 근로형태명_y 0 생산직 생산직 1 생산직 생산직 2 사무직 사무직 3 생산직 생산직 4 생산직 생산직 근무처경기도지역여부_x 근무처경기도지역여부_y 0 Y Y 1 Y Y 2 Y Y 3 Y Y 4 Y Y 근무처우편번호_x 근무처우편번호_y 0 17015 17015.0 1 11403 11403.0 2 10422 10422.0 3 18134 18134.0 4 13016 13016.0 근무처도로명주소_x \ 0 경기 용인시 기흥구 동백중앙로16번길 16-25 (중동;대우프론티어밸리 Ⅰ) 1 경기 양주시 남면 삼육사로 249-38 (한산리) 2 경기 고양시 일산동구 중앙로 1130 (마두동;강촌마을6단지아파트) 3 경기 오산시 경기대로 304 (오산동) 4 경기 하남시 서하남로418번길 46 (춘궁동) 근무처도로명주소_y 0 경기 용인시 기흥구 동백중앙로16번길 16-25 (중동;대우프론티어밸리 Ⅰ) 1 경기 양주시 남면 삼육사로 249-38 (한산리) 2 경기 고양시 일산동구 중앙로 1130 (마두동;강촌마을6단지아파트) 3 경기 오산시 경기대로 304 (오산동) 4 경기 하남시 서하남로418번길 46 (춘궁동) 근무처도로명상세주소_x 근무처도로명상세주소_y 0 713호 그린바이오(주) 713호 그린바이오(주) 1 한산리 한산리 2 국립암센터 국립암센터 3 리더스센터 3층 리더스센터 3층 4 (주)파로스 (주)파로스 근무처지번주소_x 근무처지번주소_y 0 경기 용인시 기흥구 ** **** 경기 용인시 기흥구 ** **** 1 경기 양주시 남면 *** *** 경기 양주시 남면 *** *** 2 경기 고양시 일산동구 *** *** 경기 고양시 일산동구 *** *** 3 경기 오산시 오산동 ***** 경기 오산시 오산동 ***** 4 경기 하남시 춘궁동 *** 경기 하남시 춘궁동 *** 근무처지번상세주소_x 근무처지번상세주소_y 0 713호 그린바이오(주) 713호 그린바이오(주) 1 NaN NaN 2 NaN NaN 3 NaN NaN 4 NaN NaN 근무처명_x 근무처명_y 0 그린바이오(주) 그린바이오(주) 1 보이트씨앤아이 보이트씨앤아이 2 국립암센터 국립암센터 3 (주)오산교차로 (주)오산교차로 4 (주)파로스 (주)파로스 근로기간명_x 근로기간명_y 0 6개월 미만 6개월 미만 1 2년 이상 ~ 3년 미만 2년 이상 ~ 3년 미만 2 6개월 미만 6개월 미만 3 4년 이상 4년 이상 4 3년 이상 ~ 4년 미만 3년 이상 ~ 4년 미만 거주상태명_x 거주상태명_y 0 2천만원이상~5천만원미만 전월세 2천만원이상~5천만원미만 전월세 1 무상거주 무상거주 2 2천만원 미만 전월세 2천만원 미만 전월세 3 2천만원 미만 전월세 2천만원 미만 전월세 4 5천만원이상~1억원미만 전월세 5천만원이상~1억원미만 전월세 자동차본인명_x 자동차본인명_y 0 차량없음 차량없음 1 차량없음 차량없음 2 차량없음 차량없음 3 차량없음 차량없음 4 차량없음 차량없음 자동차가구원명_x 자동차가구원명_y 0 차량없음 차량없음 1 2;000cc 이상 2;000cc 이상 2 차량없음 차량없음 3 차량없음 차량없음 4 1;000cc 미만 경차 1;000cc 미만 경차 파티션기준일_x 파티션기준일_y 0 2017-04-18 2017-04-10 1 2017-04-18 2017-04-10 2 2017-04-18 2017-04-10 3 2017-05-01 2017-04-10 4 2017-04-20 2017-04-10
for a in check :
print(a)
print((merged[a+'_x']==merged[a+'_y']).value_counts())
print('')
등록일시 False 94279 True 1 dtype: int64 수정일시 False 68639 True 25641 dtype: int64 삭제여부 True 94245 False 35 dtype: int64 저축목적명 True 90909 False 3371 dtype: int64 연령 True 94280 dtype: int64 성별코드 True 94280 dtype: int64 결혼상태명 True 92986 False 1294 dtype: int64 우편번호 True 94280 dtype: int64 지번주소 True 94280 dtype: int64 가구원수 True 94280 dtype: int64 경기도거주기간명 True 94280 dtype: int64 직업명 True 47994 False 46286 dtype: int64 3D업종명 False 91334 True 2946 dtype: int64 제조업종명 False 85218 True 9062 dtype: int64 근로형태명 True 81842 False 12438 dtype: int64 근무처경기도지역여부 True 69478 False 24802 dtype: int64 근무처우편번호 True 94280 dtype: int64 근무처도로명주소 True 94280 dtype: int64 근무처도로명상세주소 True 94280 dtype: int64 근무처지번주소 True 94280 dtype: int64 근무처지번상세주소 False 81162 True 13118 dtype: int64 근무처명 True 94280 dtype: int64 근로기간명 True 94280 dtype: int64 거주상태명 True 47993 False 46287 dtype: int64 자동차본인명 True 47993 False 46287 dtype: int64 자동차가구원명 True 47993 False 46287 dtype: int64 파티션기준일 False 91988 True 2292 dtype: int64
merged[['저축목적명_x','저축목적명_y']][merged['저축목적명_x']!=merged['저축목적명_y']]
저축목적명_x | 저축목적명_y | |
---|---|---|
88308 | NaN | NaN |
88309 | NaN | NaN |
88310 | NaN | NaN |
88311 | NaN | NaN |
88314 | NaN | NaN |
... | ... | ... |
94271 | NaN | NaN |
94272 | NaN | NaN |
94273 | NaN | NaN |
94274 | NaN | NaN |
94275 | NaN | NaN |
3371 rows × 2 columns
merged_nona = merged.fillna('nan')
for a in check :
print(a)
print((merged_nona[a+'_x']==merged_nona[a+'_y']).value_counts())
print('')
등록일시 False 94279 True 1 dtype: int64 수정일시 False 68639 True 25641 dtype: int64 삭제여부 True 94245 False 35 dtype: int64 저축목적명 True 94280 dtype: int64 연령 True 94280 dtype: int64 성별코드 True 94280 dtype: int64 결혼상태명 True 94280 dtype: int64 우편번호 True 94280 dtype: int64 지번주소 True 94280 dtype: int64 가구원수 True 94280 dtype: int64 경기도거주기간명 True 94280 dtype: int64 직업명 True 94280 dtype: int64 3D업종명 True 94280 dtype: int64 제조업종명 True 94280 dtype: int64 근로형태명 True 94280 dtype: int64 근무처경기도지역여부 True 94280 dtype: int64 근무처우편번호 True 94280 dtype: int64 근무처도로명주소 True 94280 dtype: int64 근무처도로명상세주소 True 94280 dtype: int64 근무처지번주소 True 94280 dtype: int64 근무처지번상세주소 True 94280 dtype: int64 근무처명 True 94280 dtype: int64 근로기간명 True 94280 dtype: int64 거주상태명 True 94280 dtype: int64 자동차본인명 True 94280 dtype: int64 자동차가구원명 True 94280 dtype: int64 파티션기준일 False 91988 True 2292 dtype: int64
merged_cols = list(merged_nona.columns)
for a in check :
merged_cols.remove(a+'_y')
merged_nona1 = merged_nona[merged_cols]
new_col = []
for a in list(merged_nona1.columns) :
b = a.replace('_x','')
new_col.append(b)
merged_nona1.columns = new_col
merged_nona1.to_csv('소득 합친거.csv')
merged_nona1.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 94280 entries, 0 to 94279 Data columns (total 97 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 선발정보번호 94280 non-null int64 1 근로소득금액 94280 non-null int64 2 사업소득금액 94280 non-null int64 3 재산소득금액 94280 non-null int64 4 기타소득금액 94280 non-null int64 5 실제소득금액 94280 non-null int64 6 최대소득인정금액 94280 non-null int64 7 가구특성해당여부 94280 non-null object 8 차량보유상태명 94280 non-null object 9 가산기준충족명 94280 non-null object 10 중위소득결과값 94280 non-null int64 11 가구특성점수 94280 non-null float64 12 경기도거주기간점수 94280 non-null float64 13 현재직장근로기간점수 94280 non-null float64 14 거주상태점수 94280 non-null float64 15 차량보유상태점수 94280 non-null float64 16 중위소득결과점수 94280 non-null float64 17 가산기준충족점수 94280 non-null float64 18 평가점수총점수 94280 non-null float64 19 기초공제금액 94280 non-null int64 20 부채금액 94280 non-null int64 21 주거용재산금액 94280 non-null int64 22 주거용소득환산액 94280 non-null float64 23 일반재산금액 94280 non-null int64 24 일반재산소득환산액 94280 non-null float64 25 자동차재산금액 94280 non-null int64 26 자동차재산소득환산액 94280 non-null float64 27 재산소득환산금액 94280 non-null int64 28 소득인정금액 94280 non-null int64 29 적격상태명 94280 non-null object 30 예비선발순위 94280 non-null object 31 읍면동담당자확인명 94280 non-null object 32 읍면동담당자확인일시 94280 non-null object 33 통합조사담당자확인명 94280 non-null object 34 통합조사담당자확인일시 94280 non-null object 35 지원대상여부 94280 non-null object 36 시도담당자확인명 94280 non-null object 37 시도담당자확인일자 94280 non-null object 38 비고내용 94280 non-null object 39 등록일시 94280 non-null object 40 수정일시 94280 non-null object 41 삭제여부 94280 non-null object 42 근무소재지점수 94280 non-null float64 43 저축목적명 94280 non-null object 44 연령 94280 non-null int64 45 성별코드 94280 non-null object 46 결혼상태명 94280 non-null object 47 우편번호 94280 non-null int64 48 지번주소 94280 non-null object 49 가구원수 94280 non-null int64 50 경기도거주기간명 94280 non-null object 51 직업명 94280 non-null object 52 3D업종명 94280 non-null object 53 제조업종명 94280 non-null object 54 근로형태명 94280 non-null object 55 근무처경기도지역여부 94280 non-null object 56 근무처우편번호 94280 non-null int64 57 근무처도로명주소 94280 non-null object 58 근무처도로명상세주소 94280 non-null object 59 근무처지번주소 94280 non-null object 60 근무처지번상세주소 94280 non-null object 61 근무처명 94280 non-null object 62 근로기간명 94280 non-null object 63 거주상태명 94280 non-null object 64 자동차본인명 94280 non-null object 65 자동차가구원명 94280 non-null object 66 파티션기준일 94280 non-null object 67 부채상환본인대출금액 94280 non-null int64 68 부채상환본인내용 94280 non-null object 69 부채상환본인부재여부 94280 non-null object 70 부채상환가구원금액 94280 non-null int64 71 부채상환가구원내용 94280 non-null object 72 부채상환가구원부재여부 94280 non-null object 73 신청사유내용 94280 non-null object 74 전세월세보증금액 94280 non-null int64 75 상가보증금액 94280 non-null int64 76 기타금액 94280 non-null int64 77 단계1동의여부 94280 non-null object 78 단계2동의여부 94280 non-null object 79 단계3동의여부 94280 non-null object 80 개인정보사용동의여부 94280 non-null object 81 개인정보사용동의일시 94280 non-null object 82 신청상태명 94280 non-null object 83 신청일시 94280 non-null object 84 재신청일시 94280 non-null object 85 거절사유내용 94280 non-null object 86 거절일자 94280 non-null object 87 사용여부 94280 non-null object 88 신청경로명 94280 non-null object 89 가산점수값 94280 non-null object 90 직업유형명 94280 non-null object 91 기업유형명 94280 non-null object 92 건강보험명 94280 non-null object 93 건강보험료월1금액 94280 non-null object 94 건강보험료월2금액 94280 non-null object 95 건강보험료월3금액 94280 non-null object 96 건강보험료평균금액 94280 non-null object dtypes: float64(12), int64(24), object(61) memory usage: 70.5+ MB
data = pd.read_csv('소득 합친거.csv')
del data['Unnamed: 0']
data = data.fillna('nan(str)')
data = data.fillna('nan(str)')
data1 = data[['저축목적명', '연령', '성별코드', '결혼상태명', '우편번호', '지번주소', '가구원수','직업명','3D업종명', '제조업종명', '근로형태명', '근무처경기도지역여부', '근무처우편번호', '근무처도로명주소',
'근무처도로명상세주소', '근무처지번주소', '근무처지번상세주소', '근무처명', '거주상태명',
'자동차본인명', '자동차가구원명','신청경로명', '직업유형명', '기업유형명', '건강보험명']] # 개인식별이 가능한 컬럼만 남김
col = ['저축목적명', '연령', '성별코드', '결혼상태명', '우편번호', '지번주소', '가구원수','직업명','3D업종명', '제조업종명', '근로형태명', '근무처경기도지역여부', '근무처우편번호', '근무처도로명주소',
'근무처도로명상세주소', '근무처지번주소', '근무처지번상세주소', '근무처명', '거주상태명',
'자동차본인명', '자동차가구원명','신청경로명', '직업유형명', '기업유형명', '건강보험명']
data1[data1.duplicated()] # 중복 좀 있음
data2 = data1.drop_duplicates(keep='last') # 중복 제거
data3 = data.iloc[data2.index]
long = data3['신청사유내용'].loc[data3['신청사유내용'].str.len() > 20]
long[long.duplicated(keep=False)].sort_values()
data3.loc[64393,col][data3.loc[64393,col]!=data3.loc[71051,col]] # 재신청 할때 저축목적, 직장이 바뀜, 사유 중복을 제거하기로 함
long_1 = long.drop_duplicates(keep = 'last')
len(long), len(long_1)
data4 = data.iloc[long_1.index,:]
len(data)-len(data4), len(data4)
data4.to_csv('중복제거.csv')
data = data4[['선발정보번호','소득인정금액','저축목적명','연령','성별코드','가구원수','경기도거주기간명','근무처도로명주소','근로기간명',
'신청사유내용','신청상태명','신청일시','직업유형명','기업유형명']].copy()
# 신청일시 컬럼 가공
data['신청일시'] = data['신청일시'].astype('datetime64')
data['신청년도'] = data['신청일시'].dt.year
data['신청월'] = data['신청일시'].dt.month
data['신청년월'] = data['신청년도'].astype('string')+'-'+data['신청월'].astype('string')
# 연령 20,30대로 한정
data = data[data['연령'].isin([20,30])]
# 저축목적명 None 값 지정
data.loc[data.저축목적명 == 'nan(str)', '저축목적명'] = None
# 가구원수 수정 컬럼 추가
data['가구원수 수정']=data['가구원수'].astype('string')
data.loc[data['가구원수']>=5, '가구원수 수정'] = '5 이상'
# 소득인정금액 4분위수 확인
data.소득인정금액.describe().astype(int)
count 92019 mean 3783650 std 7036135 min 0 25% 1800000 50% 2709974 75% 4015889 max 956675896 Name: 소득인정금액, dtype: int32
# 소득인정금액 수정 컬럼 추가
data.loc[data.소득인정금액<1800000, '소득인정금액수정'] = '~180'
data.loc[data.소득인정금액.between(1800000,2709974), '소득인정금액수정'] = '180~270'
data.loc[data.소득인정금액.between(2709975,4015889), '소득인정금액수정'] = '270~401'
data.loc[data.소득인정금액.between(4015890,10000000), '소득인정금액수정'] = '401~1000'
data.loc[data.소득인정금액>10000000, '소득인정금액수정'] = '1000~'
data.소득인정금액수정.value_counts()
180~270 23637 270~401 22966 ~180 22411 401~1000 19202 1000~ 3803 Name: 소득인정금액수정, dtype: int64
fig, ax = plt.subplots(1,2,figsize = (15,5))
sns.countplot(data=data, x = '성별코드', hue = '연령', ax=ax[0]);
sns.countplot(data=data, x = '신청년도', ax = ax[1]);
data.소득인정금액.describe().astype(int)
count 92019 mean 3783650 std 7036135 min 0 25% 1800000 50% 2709974 75% 4015889 max 956675896 Name: 소득인정금액, dtype: int32
plt.figure(figsize=(14,4))
sns.distplot(data.소득인정금액, kde=False, bins = 5000)
plt.ticklabel_format(style='plain', axis='x',useOffset=False)
plt.xlim(0,20000000);
for i in ['1', '2', '3', '4', '5 이상']:
print(f'<가구원수:{i}>')
print(f'해당 인원: {data[data["가구원수 수정"]==i].소득인정금액.count():,}명')
print(f'평균 소득인정금액: {np.mean(data[data["가구원수 수정"]==i].소득인정금액):,.2f}원', end = '\n\n')
<가구원수:1> 해당 인원: 13,667명 평균 소득인정금액: 1,644,692.58원 <가구원수:2> 해당 인원: 16,123명 평균 소득인정금액: 2,745,475.77원 <가구원수:3> 해당 인원: 27,758명 평균 소득인정금액: 3,783,338.05원 <가구원수:4> 해당 인원: 26,591명 평균 소득인정금액: 4,909,110.07원 <가구원수:5 이상> 해당 인원: 7,880명 평균 소득인정금액: 5,820,863.13원
tmp = data.groupby(['신청년도','저축목적명'])['신청상태명'].count().reset_index()
f,ax = plt.subplots(2,2, figsize=(11,10),constrained_layout=True)
ax[0,0].pie(x = tmp[tmp['신청년도']==2017]['신청상태명'], labels = tmp[tmp['신청년도']==2017]['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,1].pie(x = tmp[tmp['신청년도']==2018]['신청상태명'], labels = tmp[tmp['신청년도']==2018]['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,0].pie(x = tmp[tmp['신청년도']==2019]['신청상태명'], labels = tmp[tmp['신청년도']==2019]['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,1].pie(x = tmp[tmp['신청년도']==2020]['신청상태명'], labels = tmp[tmp['신청년도']==2020]['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,0].set_title('2017');
ax[0,1].set_title('2018');
ax[1,0].set_title('2019');
ax[1,1].set_title('2020');
tmp2 = data[data['연령']==20].groupby(['성별코드','저축목적명'])['신청상태명'].count().reset_index()
tmp3 = data[data['연령']==30].groupby(['성별코드','저축목적명'])['신청상태명'].count().reset_index()
f,ax = plt.subplots(2,2, figsize=(10,8),constrained_layout=True)
ax[0,0].pie(x = tmp2[tmp2['성별코드']=='F']['신청상태명'], labels = tmp2[tmp2['성별코드']=='F']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,1].pie(x = tmp2[tmp2['성별코드']=='M']['신청상태명'], labels = tmp2[tmp2['성별코드']=='M']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,0].set_title('20대 여성');
ax[0,1].set_title('20대 남성');
ax[1,0].pie(x = tmp3[tmp3['성별코드']=='F']['신청상태명'], labels = tmp3[tmp3['성별코드']=='F']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,1].pie(x = tmp3[tmp3['성별코드']=='M']['신청상태명'], labels = tmp3[tmp3['성별코드']=='M']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,0].set_title('30대 여성');
ax[1,1].set_title('30대 남성');
tmp = data.groupby(['소득인정금액수정','저축목적명'])['신청상태명'].count().reset_index()
f,ax = plt.subplots(3,2, figsize=(11,10),constrained_layout=True)
ax[0,0].pie(x = tmp[tmp['소득인정금액수정']=='~180']['신청상태명'], labels = tmp[tmp['소득인정금액수정']=='~180']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,1].pie(x = tmp[tmp['소득인정금액수정']=='180~270']['신청상태명'], labels = tmp[tmp['소득인정금액수정']=='180~270']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,0].pie(x = tmp[tmp['소득인정금액수정']=='270~401']['신청상태명'], labels = tmp[tmp['소득인정금액수정']=='270~401']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[1,1].pie(x = tmp[tmp['소득인정금액수정']=='401~1000']['신청상태명'], labels = tmp[tmp['소득인정금액수정']=='401~1000']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[2,0].pie(x = tmp[tmp['소득인정금액수정']=='1000~']['신청상태명'], labels = tmp[tmp['소득인정금액수정']=='1000~']['저축목적명'],autopct = '%1.1f%%', colors = sns.color_palette('pastel'));
ax[0,0].set_title('~180');
ax[0,1].set_title('180~270');
ax[1,0].set_title('270~401');
ax[1,1].set_title('401~1000');
ax[2,0].set_title('1000~');
df1 = data[['연령','성별코드','소득인정금액수정','가구원수 수정']]
from kmodes.kmodes import KModes
from datetime import datetime, timedelta
#Elbow curve to find optimal K
from tqdm import tqdm
cost = []
K = range(2,6)
for num_clusters in tqdm(list(K)):
kmode = KModes(n_clusters=num_clusters, init = "random", n_init = 5, verbose=1)
kmode.fit_predict(df1)
cost.append(kmode.cost_)
plt.plot(K, cost, 'bx-')
plt.xlabel('No. of clusters')
plt.ylabel('Cost')
plt.title('Elbow Method For Optimal k')
plt.show()
0%| | 0/4 [00:00<?, ?it/s]
Init: initializing centroids Init: initializing clusters Starting iterations... Run 1, iteration: 1/100, moves: 20494, cost: 166251.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 2, iteration: 1/100, moves: 0, cost: 179432.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 3, iteration: 1/100, moves: 18523, cost: 148903.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 4, iteration: 1/100, moves: 17962, cost: 148903.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 5, iteration: 1/100, moves: 14478, cost: 147266.0 Best run was number 5
25%|█████████████████████ | 1/4 [00:34<01:44, 34.69s/it]
Init: initializing centroids Init: initializing clusters Starting iterations... Run 1, iteration: 1/100, moves: 14164, cost: 148365.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 2, iteration: 1/100, moves: 16588, cost: 136842.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 3, iteration: 1/100, moves: 4919, cost: 145897.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 4, iteration: 1/100, moves: 0, cost: 145056.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 5, iteration: 1/100, moves: 21351, cost: 128033.0 Best run was number 5
50%|██████████████████████████████████████████ | 2/4 [01:10<01:11, 35.63s/it]
Init: initializing centroids Init: initializing clusters Starting iterations... Run 1, iteration: 1/100, moves: 22145, cost: 137253.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 2, iteration: 1/100, moves: 26344, cost: 127448.0 Run 2, iteration: 2/100, moves: 273, cost: 127448.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 3, iteration: 1/100, moves: 33481, cost: 117059.0 Run 3, iteration: 2/100, moves: 3112, cost: 117059.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 4, iteration: 1/100, moves: 32366, cost: 111404.0 Run 4, iteration: 2/100, moves: 2056, cost: 111404.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 5, iteration: 1/100, moves: 0, cost: 135762.0 Best run was number 4
75%|███████████████████████████████████████████████████████████████ | 3/4 [02:06<00:44, 44.65s/it]
Init: initializing centroids Init: initializing clusters Starting iterations... Run 1, iteration: 1/100, moves: 9053, cost: 124314.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 2, iteration: 1/100, moves: 25867, cost: 103934.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 3, iteration: 1/100, moves: 8987, cost: 113526.0 Run 3, iteration: 2/100, moves: 2295, cost: 113526.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 4, iteration: 1/100, moves: 28151, cost: 115624.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 5, iteration: 1/100, moves: 28166, cost: 103588.0 Run 5, iteration: 2/100, moves: 2444, cost: 103588.0 Best run was number 5
100%|████████████████████████████████████████████████████████████████████████████████████| 4/4 [03:12<00:00, 48.12s/it]
kmode = KModes(n_clusters=4, init = "random", n_init = 5, verbose=1)
clusters = kmode.fit_predict(df1)
clusters
Init: initializing centroids Init: initializing clusters Starting iterations... Run 1, iteration: 1/100, moves: 27363, cost: 120616.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 2, iteration: 1/100, moves: 21674, cost: 127770.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 3, iteration: 1/100, moves: 20080, cost: 122437.0 Run 3, iteration: 2/100, moves: 2829, cost: 122437.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 4, iteration: 1/100, moves: 18203, cost: 119678.0 Init: initializing centroids Init: initializing clusters Starting iterations... Run 5, iteration: 1/100, moves: 18858, cost: 128486.0 Run 5, iteration: 2/100, moves: 12304, cost: 128486.0 Best run was number 4
array([0, 2, 0, ..., 0, 2, 0], dtype=uint16)